package com.java.study.common.utils;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 枚举类工具
 * @author jiangli
 * @date 2018/9/317:27
 */
public class EnumUtil {
    /**
     * 根据code返回指定编码的枚举
     */
    public static <T extends BaseEnum> T getEnumByCode(Class<T> clazz, int code) {
        for(T _enum : clazz.getEnumConstants())
            if(code == _enum.toCode())
                return _enum;
        return null;
    }

    /**
     * 根据value返回指定编码的枚举
     */
    public static <T extends BaseEnum> T getEnumByValue(Class<T> clazz, String value) {
        for(T _enum : clazz.getEnumConstants())
            if(_enum.toValue().equals(value))
                return _enum;
        return null;
    }

    /**
     * 根据label返回指定描述的枚举
     */
    public static <T extends BaseEnum> T getEnumByDesc(Class<T> clazz, String label) {
        for(T _enum : clazz.getEnumConstants())
            if(_enum.toLabel().equals(label))
                return _enum;
        return null;
    }

    /**
     * 枚举转list
     *
     * @param cls 实现了BaseEnum的子类
     * @return 转换失败返回null
     */
    public static <T> List<Map<String, Object>> enumToList(Class<T> cls) {
        List<Map<String, Object>> list = null;
        if (cls != null) {
            list = new ArrayList<>();
            try {
                Method method = cls.getDeclaredMethod("values");
                BaseEnum[] be = (BaseEnum[]) method.invoke(cls);

                for (BaseEnum e : be) {
                    Map<String, Object> map = new HashMap<String, Object>();
                    map.put("code", e.toCode());
                    map.put("value", e.toValue());
                    map.put("label", e.toLabel());
                    list.add(map);
                }
            } catch (Exception e) {
                return null;
            }
        }
        return list;

    }
}
